import { NextResponse } from 'next/server'; import type { ReviewDecision } from '@/components/admin/types'; import { adminApi, AdminApiError } from '@/lib/admin-api'; import { isAdmin } from '@/lib/admin-auth'; export const dynamic = 'force-dynamic'; const DECISIONS: ReviewDecision[] = ['merged', 'kept_separate', 'dismissed']; /** Entity-resolution decision: body `{ "decision": "merged" | "kept_separate" | "dismissed" }`. Merges are audited server-side (entity_merges). */ export async function POST(req: Request, ctx: { params: Promise<{ id: string }> }): Promise { if (!(await isAdmin())) return NextResponse.json({ error: { title: 'Unauthorized', status: 401 } }, { status: 401 }); const { id } = await ctx.params; const itemId = Number(id); const body = (await req.json().catch(() => null)) as { decision?: unknown } | null; const decision = body?.decision; if (!Number.isInteger(itemId) || typeof decision !== 'string' || !DECISIONS.includes(decision as ReviewDecision)) { return NextResponse.json({ error: { title: 'Invalid request', detail: 'decision must be merged | kept_separate | dismissed', status: 422 } }, { status: 422 }); } try { const out = await adminApi.decide(itemId, decision as ReviewDecision, 'admin-web'); return NextResponse.json(out.data); } catch (e) { const status = e instanceof AdminApiError && e.status > 0 ? e.status : 502; return NextResponse.json({ error: { title: 'Decision failed', detail: (e as Error).message, status } }, { status }); } }